package com.linkgie.galaxyframework.utils;

import java.util.Objects;

public final class Assert {

	/**
	 * 断言指定值为空（null）；
	 * 
	 * @param value   值；
	 * @param message 断言失败的错误消息；
	 */
	public static void isNull(Object value, String message) {
		if (value != null) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	/**
	 * 断言指定值为空（null）；
	 * 
	 * @param value   值；
	 * @param message 断言失败的错误消息；
	 */
	public static void isNull(Object value, String messageFormat, Object... args) {
		if (value != null) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, String.format(messageFormat, args));
		}
	}

	/**
	 * 断言指定值非空（null）；
	 * 
	 * @param value   值；
	 * @param message 断言失败的错误消息；
	 */
	public static void notNull(Object value, String message) {
		if (value == null) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	/**
	 * 断言指定值非空（null）；
	 * 
	 * @param value   值；
	 * @param message 断言失败的错误消息；
	 */
	public static void notNull(Object value, String messageFormat, Object... args) {
		if (value == null) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, String.format(messageFormat, args));
		}
	}

	/**
	 * 断言指定的两个值相等；
	 * 
	 * @param value1
	 * @param value2
	 * @param message 断言失败的错误消息；
	 */
	public static void equal(Object value1, Object value2) {
		if (!Objects.equals(value1, value2)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, "Value1 does not equals value2");
		}
	}

	/**
	 * 断言指定的两个值相等；
	 * 
	 * @param value1
	 * @param value2
	 * @param message 断言失败的错误消息；
	 */
	@Deprecated
	public static void equal(Object value1, Object value2, String message) {
		equals(value1, value2, message);
	}
	
	/**
	 * 断言指定的两个值相等；
	 * 
	 * @param value1
	 * @param value2
	 * @param message 断言失败的错误消息；
	 */
	public static void equals(long value1, long value2, String message) {
		if (value1 != value2) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}
	
	/**
	 * 断言指定的两个值相等；
	 * 
	 * @param value1
	 * @param value2
	 * @param message 断言失败的错误消息；
	 */
	public static void equals(int value1, int value2, String message) {
		if (value1 != value2) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	/**
	 * 断言指定的两个值相等；
	 * 
	 * @param value1
	 * @param value2
	 * @param message 断言失败的错误消息；
	 */
	public static void equals(Object value1, Object value2, String message) {
		if (!Objects.equals(value1, value2)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	/**
	 * 断言指定的两个值相等；
	 * 
	 * @param value1
	 * @param value2
	 * @param message 断言失败的错误消息；
	 */
	public static void equal(Object value1, Object value2, String messageFormat, Object... args) {
		if (!Objects.equals(value1, value2)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, String.format(messageFormat, args));
		}
	}

	/**
	 * 断言指定的两个值不相等；
	 * 
	 * @param value1
	 * @param value2
	 * @param message 断言失败的错误消息；
	 */
	public static void notEqual(Object value1, Object value2) {
		if (Objects.equals(value1, value2)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, "Value1 equals value2");
		}
	}

	/**
	 * 断言指定的两个值不相等；
	 * 
	 * @param value1
	 * @param value2
	 * @param message 断言失败的错误消息；
	 */
	public static void notEqual(Object value1, Object value2, String message) {
		if (Objects.equals(value1, value2)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	/**
	 * 断言指定的两个值不相等；
	 * 
	 * @param value1
	 * @param value2
	 * @param message 断言失败的错误消息；
	 */
	public static void notEqual(Object value1, Object value2, String messageFormat, Object... args) {
		if (Objects.equals(value1, value2)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, String.format(messageFormat, args));
		}
	}

	/**
	 * 断言指定值是空白字符；
	 * 
	 * @param value   值；
	 * @param message 断言失败的错误消息；
	 */
	public static void isBlank(String value, String message) {
		if (!TextUtils.isBlank(value)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	/**
	 * 断言指定值是空白字符；
	 * 
	 * @param value   值；
	 * @param message 断言失败的错误消息；
	 */
	public static void isBlank(String value, String messageFormat, Object... args) {
		if (!TextUtils.isBlank(value)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, String.format(messageFormat, args));
		}
	}

	/**
	 * 断言指定值不是空白字符；
	 * 
	 * @param value   值；
	 * @param message 断言失败的错误消息；
	 */
	public static void notBlank(String value, String message) {
		if (TextUtils.isBlank(value)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	/**
	 * 断言指定值不是空白字符；
	 * 
	 * @param value   值；
	 * @param message 断言失败的错误消息；
	 */
	public static void notBlank(String value, String messageFormat, Object... args) {
		if (TextUtils.isBlank(value)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, String.format(messageFormat, args));
		}
	}

	public static void isEmpty(String value, String message) {
		if (!TextUtils.isEmpty(value)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	public static void isEmpty(String value, String messageFormat, Object... args) {
		if (!TextUtils.isEmpty(value)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, String.format(messageFormat, args));
		}
	}

	public static void notEmpty(String text, String message) {
		if (TextUtils.isEmpty(text)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	public static void notEmpty(String text, String messageFormat, Object... args) {
		if (TextUtils.isEmpty(text)) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, String.format(messageFormat, args));
		}
	}

	public static void notEmpty(Object[] array, String message) {
		if (array == null || array.length == 0) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	public static void isTrue(boolean expression, String message) {
		if (!expression) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, message);
		}
	}

	public static void isTrue(boolean expression, String messageFormat, Object... args) {
		if (!expression) {
			throw new ApplicationException(RuntimeStatus.INVALID_PARAMETERS, String.format(messageFormat, args));
		}
	}
}
